// 用户个人资料页面逻辑
const app = getApp();
const tokenManager = require('../../utils/tokenManager');

Page({
  data: {
    userInfo: null,
    loading: false,
    editMode: false,
    formData: {
      nickname: '',
      email: '',
      phone: ''
    },
    avatarUrl: ''
  },
  
  onLoad() {
    // 检查登录状态
    if (!tokenManager.isLoggedIn()) {
      this.redirectToLogin();
      return;
    }
    
    this.loadUserInfo();
  },
  
  onShow() {
    // 每次页面显示时刷新数据
    if (tokenManager.isLoggedIn()) {
      this.loadUserInfo();
    }
  },
  
  /**
   * 加载用户信息
   */
  async loadUserInfo() {
    this.setData({ loading: true });
    
    try {
      const token = tokenManager.getAccessToken();
      const userInfo = await app.api.user.getProfile(token);
      
      this.setData({
        userInfo,
        avatarUrl: userInfo.avatar,
        formData: {
          nickname: userInfo.nickname || '',
          email: userInfo.email || '',
          phone: userInfo.phone || ''
        },
        loading: false
      });
    } catch (error) {
      console.error('获取用户信息失败', error);
      this.setData({ loading: false });
      
      wx.showToast({
        title: '获取信息失败',
        icon: 'none'
      });
    }
  },
  
  /**
   * 处理用户输入变化
   */
  onInputChange(e) {
    const field = e.currentTarget.dataset.field;
    const value = e.detail.value;
    
    this.setData({
      [`formData.${field}`]: value
    });
  },
  
  /**
   * 处理获取手机号
   */
  getPhoneNumber(e) {
    if (e.detail.errMsg === 'getPhoneNumber:ok') {
      // 如果用户同意授权手机号
      wx.showToast({
        title: '已获取手机号',
        icon: 'success'
      });
      
      // 实际应用中，需要将cloudID发送到服务器解析
      // 此处仅作为示例，实际情况需要在服务端解析
      console.log('手机号cloudID:', e.detail.cloudID);
    } else {
      wx.showToast({
        title: '未授权手机号',
        icon: 'none'
      });
    }
  },
  
  /**
   * 切换编辑模式
   */
  toggleEditMode() {
    const { editMode, userInfo } = this.data;
    
    if (editMode) {
      // 退出编辑模式，重置表单数据
      this.setData({
        editMode: false,
        formData: {
          nickname: userInfo.nickname || '',
          email: userInfo.email || '',
          phone: userInfo.phone || ''
        }
      });
    } else {
      // 进入编辑模式
      this.setData({
        editMode: true
      });
    }
  },
  
  /**
   * 保存用户信息
   */
  async saveUserInfo() {
    const { formData } = this.data;
    
    // 表单验证
    let isValid = true;
    let errorMsg = '';
    
    // 昵称验证 - 必填且长度在2-20之间
    if (!formData.nickname || formData.nickname.trim() === '') {
      isValid = false;
      errorMsg = '昵称不能为空';
    } else if (formData.nickname.length < 2 || formData.nickname.length > 20) {
      isValid = false;
      errorMsg = '昵称长度应在2-20个字符之间';
    }
    
    // 邮箱验证 - 如果填写了则必须格式正确
    if (formData.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) {
      isValid = false;
      errorMsg = '邮箱格式不正确';
    }
    
    // 手机验证 - 如果填写了则必须符合中国大陆手机号规则
    if (formData.phone && !/^1[3-9]\d{9}$/.test(formData.phone)) {
      isValid = false;
      errorMsg = '手机号格式不正确';
    }
    
    // 如果验证失败，显示错误提示并返回
    if (!isValid) {
      wx.showToast({
        title: errorMsg,
        icon: 'none',
        duration: 2000
      });
      return;
    }
    
    // 显示加载状态
    this.setData({ loading: true });
    wx.showLoading({
      title: '保存中...',
      mask: true
    });
    
    try {
      console.log('准备更新用户资料:', formData);
      const token = tokenManager.getAccessToken();
      
      // 调用API更新用户资料
      const result = await app.api.user.updateProfile(token, formData);
      console.log('更新用户资料成功:', result);
      
      // 隐藏加载提示
      wx.hideLoading();
      
      // 显示成功提示
      wx.showToast({
        title: '保存成功',
        icon: 'success',
        duration: 1500
      });
      
      // 退出编辑模式
      this.setData({
        editMode: false,
        loading: false
      });
      
      // 重新加载用户信息以显示最新数据
      setTimeout(() => {
        this.loadUserInfo();
      }, 1500);
      
    } catch (error) {
      console.error('更新用户信息失败:', error);
      wx.hideLoading();
      this.setData({ loading: false });
      
      // 根据错误码显示不同的错误提示
      if (error.code === 409) {
        wx.showToast({
          title: error.message || '邮箱或手机号已被占用',
          icon: 'none',
          duration: 2000
        });
      } else if (error.code === 400) {
        wx.showToast({
          title: error.message || '提交的数据格式有误',
          icon: 'none',
          duration: 2000
        });
      } else if (error.code === 401) {
        wx.showToast({
          title: '登录已过期，请重新登录',
          icon: 'none',
          duration: 2000
        });
        setTimeout(() => {
          this.redirectToLogin();
        }, 2000);
      } else {
        wx.showToast({
          title: error.message || '保存失败，请稍后重试',
          icon: 'none',
          duration: 2000
        });
      }
    }
  },
  
  /**
   * 更换头像
   */
  chooseAvatar() {
    wx.chooseImage({
      count: 1,
      sizeType: ['compressed'],
      sourceType: ['album', 'camera'],
      success: (res) => {
        const tempFilePath = res.tempFilePaths[0];
        
        // 显示预览
        this.setData({
          avatarUrl: tempFilePath
        });
        
        // 弹出确认框
        wx.showModal({
          title: '更换头像',
          content: '确定要使用这张照片作为新头像吗？',
          confirmText: '确定',
          cancelText: '取消',
          success: (result) => {
            if (result.confirm) {
              this.uploadAvatar(tempFilePath);
            } else {
              // 取消更换，恢复原头像
              this.setData({
                avatarUrl: this.data.userInfo.avatar
              });
            }
          }
        });
      }
    });
  },
  
  /**
   * 上传头像
   */
  async uploadAvatar(filePath) {
    this.setData({ loading: true });
    
    try {
      const token = tokenManager.getAccessToken();
      const result = await app.api.user.updateAvatar(token, filePath);
      
      this.setData({
        avatarUrl: result.avatar,
        loading: false
      });
      
      wx.showToast({
        title: '头像更新成功',
        icon: 'success'
      });
      
      // 重新加载用户信息
      this.loadUserInfo();
    } catch (error) {
      console.error('上传头像失败', error);
      this.setData({ loading: false });
      
      wx.showToast({
        title: '上传头像失败',
        icon: 'none'
      });
    }
  },
  
  /**
   * 退出登录
   */
  logout() {
    wx.showModal({
      title: '提示',
      content: '确定要退出登录吗？',
      success: (res) => {
        if (res.confirm) {
          app.logout();
        }
      }
    });
  },
  
  /**
   * 跳转到登录页
   */
  redirectToLogin() {
    wx.redirectTo({
      url: '/pages/login/login'
    });
  }
}); 